﻿using GDM.Hogar.Aplicacion.Properties;
using GDM.Hogar.Controles.Validador.Componentes;
using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using System;
using System.Linq;

namespace GDM.Hogar.Aplicacion.Formularios.Usuarios
{
    public partial class FrmConsultaUsuarios
#if DEBUG
 : FrmConsultaUsuario
#else
         : FrmConsulta<ConsultaUsuario>
#endif
    {
        private readonly IUsuarioManager _usuarioManager;

        public ConsultaUsuario Usuario { get; set; }

        #region Public Methods

        public FrmConsultaUsuarios(IUsuarioManager usuarioManager)
        {
            if (usuarioManager == null)
                throw new ArgumentNullException("usuarioManager");

            _usuarioManager = usuarioManager;
            InitializeComponent();
        }

        #endregion Public Methods

        #region Private Methods

        private void MostrarDatosUsuario()
        {
            txtUsuario.Text = Usuario.NombreUsuario;
            cmbRoles.SelectedIndex = cmbRoles.FindStringExact(Usuario.Rol);
        }

        private void Guardar()
        {
            if (!validadorUsuario.Validate()) return;

            if (Usuario != null)
            {
                //- Modo Edicion
                if (!txtUsuario.Text.Trim().ToLower().Equals(Usuario.NombreUsuario.Trim().ToLower()))
                {
                    if (_usuarioManager.ExisteUsuario(txtUsuario.Text.Trim()))
                    {
                        MostrarMensajeError(string.Format(Resources.Usuario_Existe, txtUsuario.Text.Trim()));
                        return;
                    }
                }
                GuardarUsuario(false);
            }
            else
            {
                //- Modo Creacion
                if (_usuarioManager.ExisteUsuario(txtUsuario.Text.Trim()))
                {
                    MostrarMensajeError(string.Format(Resources.Usuario_Existe, txtUsuario.Text.Trim()));
                    return;
                }
                GuardarUsuario();
            }
        }

        private void GuardarUsuario(bool nuevo = true)
        {
            try
            {
                if (nuevo)
                {
                    var usuario = InstanciarUsuario();
                    _usuarioManager.CrearUsuario(usuario.NombreUsuario, ContraseñaPorDefecto, usuario.RolId);
                }
                else
                    _usuarioManager.ActualizarUsuario(txtUsuario.Text, (int)cmbRoles.SelectedItem, Usuario.UsuarioId);
                MostrarMensajeExito(Resources.Usuario_GuardoConExito);
                LimpiarControl(gbUsuario);
                HabilitarControl(gbUsuario, false);
                dgUsuarios.DisableActions(false);
                RefrescarGrilla();
            }
            catch (InvalidOperationException ex)
            {
                MostrarMensajeError(ex.Message);
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.GuardarUsuario_Error);
            }
        }

        private Usuario InstanciarUsuario()
        {
            return new Usuario
            {
                NombreUsuario = txtUsuario.Text.Trim(),
                Activo = true,
                RolId = (int)cmbRoles.SelectedItem
            };
        }

        protected override void CrearRegistro()
        {
            HabilitarControl(gbUsuario);
            LimpiarControl(gbUsuario);
            dgUsuarios.DisableActions();
            btnResetearContraseña.Enabled = false;
            Usuario = null;
            txtUsuario.Focus();
        }

        protected override void EditarRegistro(ConsultaUsuario usuario)
        {
            Usuario = usuario;
            MostrarDatosUsuario();
            HabilitarControl(gbUsuario);
            dgUsuarios.DisableActions();
            txtUsuario.Focus();
        }

        protected override void EliminarRegistro(ConsultaUsuario usuario)
        {
            try
            {
                //- desactivar usuario en bd
                _usuarioManager.ActivarUsuario(usuario.UsuarioId, false);
                Datos.First(u => u.UsuarioId == usuario.UsuarioId).Activo = false;
                btnBuscar_Click(null, null);
                MostrarMensajeExito(Resources.Usuario_EliminadoConExito);
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.EliminarUsuario_Error);
            }
        }

        private void validadorUsuario_CustomValidation(object sender, ValidationEventArgs e)
        {
            if (e.Control == cmbRoles)
            {
                e.Valid = cmbRoles.SelectedIndex > 0;
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            dgUsuarios.Search(Datos.AsQueryable(), CriterioDeBusqueda);
        }

        private void btnQuitarFiltro_Click(object sender, EventArgs e)
        {
            LimpiarControl(gbFiltros);
            btnBuscar_Click(null, null);
        }

        private void CargarRoles()
        {
            cmbRoles.Items.Add("-- Seleccione un Rol --");
            foreach (var item in Enum.GetValues(typeof(Rol)).Cast<object>().Where(item => (Rol) item != Rol.Administrador).OrderBy(x => x.ToString()))
            {
                cmbRoles.Items.Add(item);
            }
            cmbRoles.SelectedIndex = 0;

            cmbBusqRoles.Items.Add("");
            foreach (var item in Enum.GetValues(typeof(Rol)))
            {
                cmbBusqRoles.Items.Add(item);
            }
            cmbBusqRoles.SelectedIndex = 0;
        }

        private void CargarUsuarios()
        {
            Datos = _usuarioManager.ObtenerUsuarios().Where(u => u.RolId != (int)Rol.Administrador).ToList();
            InicializarGrilla(dgUsuarios, u => u.Activo);
        }

        private bool CriterioDeBusqueda(ConsultaUsuario usuario)
        {
            var criterio = usuario.Activo && usuario.RolId != (int)Rol.Administrador;
            if (!txtBusqUsuario.Text.EsVacio()) criterio = usuario.NombreUsuario.ToLower().Contiene(txtBusqUsuario.Text.ToLower());
            if (cmbBusqRoles.SelectedIndex > 0)
            {
                criterio = criterio && usuario.RolId == (int)cmbBusqRoles.SelectedItem;
            }

            return criterio;
        }

        private void FrmConsultaUsuarios_Load(object sender, EventArgs e)
        {
            CargarRoles();
            dgUsuarios.UserCanAdd = true;
            CargarUsuarios();
            txtBusqUsuario.Focus();
            ttInfo.SetToolTip(btnQuitarFiltro, "Quitar filtro");
        }

        private void RefrescarGrilla()
        {
            Datos = _usuarioManager.ObtenerUsuarios();
            btnBuscar_Click(null, null);
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            OcultarMensajeError();
            LimpiarControl(gbUsuario);
            HabilitarControl(gbUsuario, false);
            txtUsuario.Enabled = false;
            dgUsuarios.DisableActions(false);
            validadorUsuario.Validate();
        }

        private void btnResetearContraseña_Click(object sender, EventArgs e)
        {
            try
            {
                _usuarioManager.CambiarContraseña(Usuario.UsuarioId, ContraseñaPorDefecto);
                MostrarMensajeExito(Resources.Usuario_ReseteoContraseñaConExito);
            }
            catch (Exception)
            {
                MostrarMensajeError(Resources.ResetearContraseñaUsuario_Error);
            }
        }

        private void btnGuardarUsuario_Click(object sender, EventArgs e)
        {
            Guardar();
        }

        #endregion Private Methods
    }
}